package com.itguigu.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 环绕通知解决事务
 */
@Aspect
@Component
@Order(20) // 优先级 值越小优先级越高
public class TxAroundAdvice {
    /**
     * TODO:环绕通知注意事项
     *     1.方法的要有返回值 用来返回目标方法的返回值
     *     2.方法的参数 ProceedingJoinPoint
     *     3.需要保证目标方法的执行
     *
     * @param joinPoint 目标方法（获取目标方法的返回值 多了一个执行方法）
     * @return 目标方法的返回值
     */

    @Around("com.itguigu.pointcut.mypointcut.pc1()")
    public Object tx(ProceedingJoinPoint joinPoint) {


        //获取参数
        Object[] args = joinPoint.getArgs();
        Object result = null;

        try {
            //方法执行前执行的操作
            System.out.println("开启事务");
            //保证方法执行
            result = joinPoint.proceed(args);
            //方法执行后执行的操作
            System.out.println("提交事务");
        } catch (Throwable e) {
            System.out.println("回滚事务");
            throw new RuntimeException(e);
        }

        return result;

    }
}
